﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Drawing;
using LibreriaDeClases;
namespace BattleCity
{
    static class LectorDeArchivoDeMision
    {
        static public string ObtenerPresentacion(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlNode PresentacionNode = xDoc.GetElementsByTagName("ImagenPresentacion")[0];
            string path = PresentacionNode.InnerText;
            return path;
        }
        static public int ObtenerPuntos(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlNode PuntosNode = xDoc.GetElementsByTagName("Puntos")[0];
            if (PuntosNode != null)
            {
                string path = PuntosNode.InnerText;
                return Convert.ToInt32(path);
            }
            return 0;
        }
        static public string ObtenerArchivoMision(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlNode MisionnNode = xDoc.GetElementsByTagName("ArchivoMision")[0];
            string path = "";
            if (MisionnNode != null) {
                path = MisionnNode.InnerText;
            }

            return path;
        }
        static public Point ObtenerPosicionInicialUsuario(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlNode node = xDoc.GetElementsByTagName("TanqueUser")[0];
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                return new Point(x, y);

        }
        static public List<Objeto> ObtenerObjetos(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlElement objetosNode = (XmlElement)xDoc.GetElementsByTagName("Objetos")[0];
            List<Objeto> objetos = new List<Objeto>();
            List<Objeto> tanques = ObtenerTanques(objetosNode);
            foreach (Objeto t in tanques)
            {
                Flota.getFlota().ReportarTanque((TanquePC)t);
            }
            objetos.AddRange(tanques);
            objetos.AddRange(ObtenerMuros(objetosNode));
            objetos.AddRange(ObtenerBonus(objetosNode));
            objetos.AddRange(ObtenerProyectiles(objetosNode));
            return objetos;
        }
        static public List<Objeto> ObtenerFlota(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlElement objetosNode = (XmlElement)xDoc.GetElementsByTagName("Flota")[0];
            List<Objeto> objetos = new List<Objeto>();
            objetos.AddRange(ObtenerTanques(objetosNode));
            return objetos;
        }
        static public List<Objeto> ObtenerBonus(string ArchivoConfiguracionDeMision)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ArchivoConfiguracionDeMision);
            XmlElement objetosNode = (XmlElement)xDoc.GetElementsByTagName("Bonus")[0];
            List<Objeto> objetos = new List<Objeto>();
            objetos.AddRange(ObtenerBonus(objetosNode));
            return objetos;
        }

        static private List<Objeto> ObtenerTanques(XmlElement xDoc)
        {
            List<Objeto> objetos;
            objetos = new List<Objeto>();
            XmlNodeList TanquesGrizzlyBattle = xDoc.GetElementsByTagName("TanqueGrizzlyBattle");
            CrearTanquesGrizzlyBattle(TanquesGrizzlyBattle, objetos);

            XmlNodeList TanquesIFV = xDoc.GetElementsByTagName("TanqueIFV");
            CrearTanquesIFV(TanquesIFV, objetos);

            XmlNodeList TanquesMirage = xDoc.GetElementsByTagName("TanqueMirage");
            CrearTanquesMirage(TanquesMirage, objetos);

            return objetos;
        }
        static private List<Objeto> ObtenerProyectiles(XmlElement xDoc)
        {
            List<Objeto> objetos;
            objetos = new List<Objeto>();
            XmlNodeList ProyectilesAmetralladora = xDoc.GetElementsByTagName("ProyectilAmetralladora");
            CrearProyectilesAmetralladora(ProyectilesAmetralladora, objetos);

            XmlNodeList ProyectilesCanion = xDoc.GetElementsByTagName("ProyectilCanion");
            CrearProyectilesCanion(ProyectilesCanion, objetos);

            XmlNodeList ProyectilesLanzaCohetes = xDoc.GetElementsByTagName("ProyectilLanzaCohetes");
            CrearProyectilesLanzaCohetes(ProyectilesLanzaCohetes, objetos);

            return objetos;
        }
        static private List<Objeto> ObtenerMuros(XmlElement xDoc)
        {
            List<Objeto> objetos;
            objetos = new List<Objeto>();

            XmlNodeList MurosMetal = xDoc.GetElementsByTagName("MuroMetal");
            CrearMurosMental(MurosMetal, objetos);

            XmlNodeList MurosCemento = xDoc.GetElementsByTagName("MuroCemento");
            CrearMurosCemento(MurosCemento, objetos);

            return objetos;
        }
        static private List<Objeto> ObtenerBonus(XmlElement xDoc)
        {
            List<Objeto> objetos;
            objetos = new List<Objeto>();

            XmlNodeList BonussVelocidad = xDoc.GetElementsByTagName("BonusVelocidad");
            CrearBonussVelocidad(BonussVelocidad, objetos);

            XmlNodeList BonussVida = xDoc.GetElementsByTagName("BonusVida");
            CrearBonussVida(BonussVida, objetos);

            return objetos;
        }
        static private void CrearMurosMental(XmlNodeList list,List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                MuroMetal muro = new MuroMetal(new Point(x,y));
                objetos.Add(muro);               
            }

        }
        static private void CrearMurosCemento(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                MuroCemento muro = new MuroCemento(new Point(x, y));
                objetos.Add(muro);
            }
        }
        static private void CrearTanquesGrizzlyBattle(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                if (node.SelectSingleNode("Posicion") == null)
                {
                    objetos.Add(new TanqueGrizzlyBattle());
                }
                else
                {
                    int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                    int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                    objetos.Add(new TanqueGrizzlyBattle(new Point(x, y)));
                }
            }
        }
        static private void CrearTanquesIFV(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                if (node.SelectSingleNode("Posicion") == null)
                {
                    objetos.Add(new TanqueIFV());
                }
                else
                {
                    int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                    int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                    objetos.Add(new TanqueIFV(new Point(x, y)));
                }
            }
        }
        static private void CrearTanquesMirage(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                if (node.SelectSingleNode("Posicion") == null)
                {
                    objetos.Add(new TanqueMirage());
                }
                else
                {
                    int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                    int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                    objetos.Add(new TanqueMirage(new Point(x, y)));
                }
            }
        }
        static private void CrearBonussVelocidad(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                if (node.SelectSingleNode("Posicion") == null)
                {
                    objetos.Add(new BonusVelocidad());
                }
                else
                {
                    int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                    int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                    objetos.Add(new BonusVelocidad(new Point(x, y)));
                }
            }
        }
        static private void CrearBonussVida(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                if (node.SelectSingleNode("Posicion") == null)
                {
                    objetos.Add(new BonusVida());
                }
                else
                {
                    int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                    int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                    objetos.Add(new BonusVida(new Point(x, y)));
                }
            }
        }
        static private void CrearProyectilesAmetralladora(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                string direccion = node.SelectSingleNode("Direccion").InnerText;
                objetos.Add(new ProyectilAmetralladora(new Point(x, y), obtenerdireccion(direccion)));
            }
        }
        static private void CrearProyectilesCanion(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                string direccion = node.SelectSingleNode("Direccion").InnerText;
                objetos.Add(new ProyectilCanion(new Point(x, y), obtenerdireccion(direccion)));
            }
        }
        static private void CrearProyectilesLanzaCohetes(XmlNodeList list, List<Objeto> objetos)
        {
            foreach (XmlNode node in list)
            {
                int x = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("X").InnerText);
                int y = Convert.ToInt32(node.SelectSingleNode("Posicion").SelectSingleNode("Y").InnerText);
                string direccion = node.SelectSingleNode("Direccion").InnerText;
                objetos.Add(new ProyectilLanzaCohetes(new Point(x, y), obtenerdireccion(direccion)));
            }
        }

        static private IDireccion obtenerdireccion(string direccion)
        {
            IDireccion direc;
            if (direccion == "Arriba")
            {
                direc = new Arriba();
            }
            else if (direccion == "Abajo")
            {
                direc = new Abajo();
            }
            else if (direccion == "Derecha")
            {
                direc = new Derecha();
            }
            else
            {
                direc = new Izquierda();
            }
            return direc;
        }


    }
}
